ftell関数は、ファイルの現在の入力・出力位置(ファイルオフセット)を取得することができます。
#include <stdio.h>
long ftell(FILE *stream);
*streamはfopen関数で取得した、ファイルポインタを指定します。
戻り値として、正常に処理ができた場合は現在のオフセットを、失敗した場合は-1を返します。
次の例題プログラムは、入力したデータの英小文字を英大文字に変換した後、同じ場所にデータを出力することにより、ファイル内の英字を大文字にしています。ファイルの更新を行うため、fopen関数のオープンモードは’r+’になっています。
プログラム 例
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define SIZE 1024
int main(int argc, char **argv)
{
FILE *fp;
long offset;
char buff[SIZE];
char *p_buff;
int return_code = 0;
if (argc == 2) {
if ((fp = fopen(*(argv + 1), 'r+')) != NULL) {
while(fgets(buff, SIZE, fp) != NULL) {
/* 英小文字を英大文字に変換 */
for (p_buff = buff; *p_buff; ++p_buff) {
*p_buff = toupper(*p_buff);
}
/* 入力したデータの先頭のファイルオフセットを求める */
offset = ftell(fp) - strlen(buff);
/* 入力したデータの先頭にファイルオフセットを戻す */
fseek(fp, offset, SEEK_SET);
fputs(buff, fp);
}
fclose(fp);
}
else {
printf('ファイルのオープンに失敗しました\n');
return_code = 1;
}
}
else {
printf('実行時引数の数が不当です\n');
return_code = 1;
}
return return_code;
}
例の実行結果
$ cat temp_1.txt
#include <stdio.h>
int main()
{
printf('Hello World!!.\n');
return 0;
}
$
$ ./ftell.exe temp_1.txt
$
$ cat temp_1.txt
#INCLUDE <STDIO.H>
INT MAIN()
{
PRINTF('HELLO WORLD!!.\N');
RETURN 0;
}
$